package main

import "fmt"

func upSlices(s []int) {
	s[0] = 100
}

func printSlices(s []int) {
	fmt.Println(s, len(s), cap(s))
}

func test1() {
	// 数组转切片
	arr := [...]int{12, 2, 3, 4, 5, 6, 7, 8, 9}
	s1 := arr[:]
	s2 := s1[5:]
	s3 := arr[:]
	fmt.Println(s1)

	fmt.Println("---------------------")
	fmt.Println("s2 更改之前", s2)
	upSlices(s2)
	fmt.Println("s2 更改之后", s2)
	fmt.Println("s2 更改之后的s1", s1)
	fmt.Println("s3", s3)
	fmt.Println("arr", arr)

	fmt.Println("----------------")
}

func test2() {
	fmt.Println("创建切片-----------")
	var s1 []int
	s2 := []int{1, 2, 3, 4}
	s3 := make([]int, 8)
	s4 := make([]int, 8, 32) // 长度8 cap 32

	printSlices(s1)
	printSlices(s2)
	printSlices(s3)
	printSlices(s4)

	fmt.Println("复制切片--------------")
	fmt.Println("s3", s3)
	fmt.Println("s2", s2)
	copy(s3, s2)
	fmt.Println("copy s3", s3)
	printSlices(s3)

	fmt.Println("删除切片--------------")
	// s3 = [1 2 3 4 0 0 0 0]
	s3 = append(s3[:2], s3[3:]...) // append 第二个参数是可变参数，可以将切片后面加...使切片变成参数形式
	fmt.Println(s3)

	fmt.Println("切片获取头部和尾部并删除（pop）-------------")
	front := s2[0]
	s2 = s2[1:]
	fmt.Println(front, s2)

	tail := s2[len(s2)-1]
	s2 = s2[:len(s2)-1]
	fmt.Println(tail, s2)
}

func main() {
	test2()
}
